package edu.sctu.java.advanced.reflection.lab01;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;

public class Reflection {
    // 给定字段名称，返回getter/setter方法名。
    private String getFieldMethodName(String getterOrSetter, String fieldName) {

        return getterOrSetter + fieldName.substring(0,1).toUpperCase(Locale.ROOT) + fieldName.substring(1);
    }


    // 为什么该方法不能做出静态的?
    public Object copy(Object srcObj) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {

        // (1) 获得对象的类型，后续通过该类型可以获得类的字段、方法、构造函数等信息；
        Class clz = srcObj.getClass();

        // (2) 实例化新的对象；
        Object dstObj = clz.newInstance();

        // (3) 对新对象的所有属性进行赋值，通过调用原对象的getter方法获得属性值，调用新对象的setter方法进行属性赋值
        for (Field field : clz.getDeclaredFields()) {

            // (3.1) 调用srcObj的getter方法获得属性的值
            Object value = clz.getDeclaredMethod(getFieldMethodName("get", field.getName()), new Class[]{})
                    .invoke(srcObj);

            // (3.2) 调用dstObj的setter方法设置属性的值
            clz.getDeclaredMethod(getFieldMethodName("set", field.getName()), new Class[]{field.getType()})
                    .invoke(dstObj, value);
        }

        return dstObj;
    }
}
